package com.cxs.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.Date;

/**
 * @Project: file-upload-demo
 * @Author: cxs2014501@163.com
 * @Create: 2023/3/8 10:05
 * @Description:
 **/
@Component
public class FileUploadUtil {
    /**
     * 服务器地址
     */
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    /**
     * 子账户名称
     */
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    /**
     * 子账户密码
     */
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    /**
     * 桶的名字
     */
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    private static final String[] imgArr = new String[]{".jpg",".png",".jpeg",".gif"};

    /**
     * 上传文件
     * @param fileName
     * @param content
     * @return
     * @throws Exception
     */
    public String uploadAndUrl(String fileName, byte[] content)  throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 判断是否图片
        String postStr = fileName.substring(fileName.lastIndexOf("."));
        if (Arrays.asList(imgArr).contains(postStr)){
            // 创建上传文件的元信息，可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentType("image/jpg");
            // 文件上传
            ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(content), objectMetadata);
        }else {
            ossClient.putObject(bucketName, fileName, new ByteArrayInputStream(content));
        }
        // 设置URL过期时间为1小时
        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000);
        //返回url地址
        String url = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
        //关闭OSSClient。
        ossClient.shutdown();
        return url;
    }

    /**
     * 删除文件
     * @param fileName
     */
    public void deleteFile(String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 删除文件。如需删除文件夹，请将fileName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
        ossClient.deleteObject(bucketName, fileName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }
}
